package xml.laberinto;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import xml.adapter.LaberintoObjectAdapter;
import xml.adapter.PosicionAdapter;

import dominio.Laberinto;
import dominio.Nodo;
import dominio.Posicion;
import dominio.Sentido;

@XmlRootElement(name="nodo")
@XmlType (propOrder={"abajo", "arriba", "derecha", "izquierda", "contiene", "columna", "fila", "id"})
public class XmlNodo {
	
	private String id;	
	private Nodo nodo;
	private Map<Sentido, String> vecinos;
	
	public XmlNodo() {
		this.nodo = new Nodo();
		this.nodo.setPosicion(new Posicion());
		inicializarVecinos();
	}
	
	public XmlNodo(Nodo nodo, Laberinto laberinto) {
		this.nodo = nodo;
		this.id = laberinto.getNodoId(nodo);
		inicializarVecinos();
		setVecinosDelNodoActual(laberinto);
	}
	
	public XmlNodo(String id, Nodo nodo, Laberinto laberinto) {
		this.id = id;
		this.nodo = nodo;
		inicializarVecinos();
		setVecinosDelNodoActual(laberinto);
	}
	
	private void setVecinosDelNodoActual(Laberinto laberinto) {
		for (Sentido sentido : Sentido.getTodosLosSentidos()) {
			if (this.nodo.getVecino(sentido) != null) {
				this.vecinos.put(sentido, laberinto.getNodoId(this.nodo.getVecino(sentido)));
			}
		}
	}
	
	private void inicializarVecinos() {
		this.vecinos = new HashMap<Sentido, String>();
		for (Sentido sentido : Sentido.getTodosLosSentidos()) {
			this.vecinos.put(sentido, "");
		}
	}

	@XmlAttribute
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	
	@XmlAttribute
	public String getFila() {
		return PosicionAdapter.adapt(this.nodo.getPosicion().getFila());
	}
	public void setFila(String fila) {
		this.nodo.getPosicion().setFila(new Integer(fila));
	}

	@XmlAttribute
	public String getColumna() {
		return PosicionAdapter.adapt(this.nodo.getPosicion().getColumna());
	}
	public void setColumna(String columna) {
		this.nodo.getPosicion().setColumna(new Integer(columna));
	}

	@XmlAttribute
	public String getContiene() {
		if (this.nodo.getContiene() != null) {
			return LaberintoObjectAdapter.adapt(this.nodo.getContiene());			
		} else {
			return "";
		}
	}
	public void setContiene(String contiene) {
		this.nodo.setContiene(LaberintoObjectAdapter.adapt(contiene));
	}

	@XmlAttribute
	public void setIzquierda(String izquierda) {
		this.vecinos.put(Sentido.IZQUIERDA, izquierda);
	}
	public String getIzquierda() {
		return this.vecinos.get(Sentido.IZQUIERDA);
	}

	@XmlAttribute
	public void setDerecha(String derecha) {
		this.vecinos.put(Sentido.DERECHA, derecha);
	}
	public String getDerecha() {
		return this.vecinos.get(Sentido.DERECHA);
	}

	@XmlAttribute
	public void setArriba(String arriba) {
		this.vecinos.put(Sentido.ARRIBA, arriba);
	}
	public String getArriba() {
		return this.vecinos.get(Sentido.ARRIBA);
	}	

	@XmlAttribute
	public void setAbajo(String abajo) {
		this.vecinos.put(Sentido.ABAJO, abajo);
	}
	public String getAbajo() {
		return this.vecinos.get(Sentido.ABAJO);
	}
	
	public String getVecino(Sentido sentido) {
		return this.vecinos.get(sentido);
	}
	
	public void putVecino(Sentido sentido, String idVecino) {
		this.vecinos.put(sentido, idVecino);
	}

	public Nodo getNodo() {
		return nodo;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		XmlNodo other = (XmlNodo) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
}